package com.hzlj.position.locate.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.util.ObjectUtil;
import com.fz.common.base.core.JsonUtils;
import com.google.common.collect.Lists;
import com.hzlj.position.locate.common.dto.positionSysCheck.*;
import com.hzlj.position.locate.common.enums.DifferentiationDataType;
import com.hzlj.position.locate.common.model.PositionSysCheck;
import com.hzlj.position.locate.converter.PositionSysCheckConverter;
import com.hzlj.position.locate.dao.PositionSysCheckDao;
import com.hzlj.position.locate.service.PositionSysCheckService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

import static com.hzlj.position.config.config.IdConfig.POSITION_ID_GEN;

/**
 * 位置系统核验表(PositionSysCheck)表服务接口
 *
 * @author makejava
 * @date 2024-08-16 13:47:31
 */
@Slf4j
@Service
public class PositionSysCheckServiceImpl implements PositionSysCheckService {
    @Resource
    private PositionSysCheckDao positionSysCheckDao;

    @Override
    public void savePositionSysCheck(DifferentiationDataType dataType, PositionSysCheckAddDTO dto) {
        this.savePositionSysCheck(dataType, Lists.newArrayList(dto));
    }

    @Override
    public void savePositionSysCheck(DifferentiationDataType dataType, List<PositionSysCheckAddDTO> dtos) {
        log.info("保存系统核查步骤信息:dataType={},dtos={}", dataType, JsonUtils.obj2json(dtos));
        List<PositionSysCheck> adds = dtos.stream().map(PositionSysCheckConverter::from)
                .peek(e -> {
                    e.setId(POSITION_ID_GEN.nextIdStr());
                    e.setDataType(dataType.getDataType());
                })
                .collect(Collectors.toList());
        this.positionSysCheckDao.saveBatch(adds);
    }

    @Override
    public void updatePositionSysCheck(DifferentiationDataType dataType, PositionSysCheckUpdateDTO dto) {
        PositionSysCheck update = this.positionSysCheckDao.getPositionSysCheckByOrgPositionId(dataType.getDataType(), dto.getOriPositionId(), dto.getSysCheckStep());
        if (update == null) {
            log.warn("没有找到系统核查记录，不能更新:dataType={},dto={}", dataType, dto);
            return;
        }
        //更新ext
        PositionSysCheckExtDTO sysCheckExt = ObjectUtil.defaultIfNull(update.getSysCheckExt(), new PositionSysCheckExtDTO());
        BeanUtil.copyProperties(dto.getSysCheckExt(), sysCheckExt, CopyOptions.create().ignoreNullValue());
        dto.setSysCheckExt(null);
        update.setSysCheckExt(sysCheckExt);
        BeanUtil.copyProperties(dto, update, CopyOptions.create().ignoreNullValue());
        this.positionSysCheckDao.updateById(update);
    }

    @Override
    public PositionSysCheckQueryResultDTO getPositionSysCheck(DifferentiationDataType dataType, String oriPositionId, String sysCheckStep) {
        PositionSysCheck sysCheck = positionSysCheckDao.getPositionSysCheckByOrgPositionId(dataType.getDataType(), oriPositionId, sysCheckStep);
        if (sysCheck == null) {
            return null;
        }
        return PositionSysCheckConverter.from(sysCheck);
    }

    /**
     * 查询列表：不分页
     */
    @Override
    public List<PositionSysCheckQueryResultDTO> listPositionSysCheck(PositionSysCheckQueryParamDTO dto) {
        return this.positionSysCheckDao.listPositionSysCheck(dto);
    }
}
